package com.tom.joke.bank.dynamic;

import com.tom.joke.bank.IBank;
import com.tom.joke.bank.Man;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Added by Tom on 2024/07/08.
 */
public class DynamicClient {
    public static void main(String[] args) {
        Man man = new Man();
        // 第二个参数接口 类数组; 第三个参数回调
        // 获取代理。这个代理，代理了所有的方法，且能走InvocationHandler.invoke()方法。
        IBank proxy = (IBank) Proxy.newProxyInstance(IBank.class.getClassLoader(),
                new Class<?>[]{IBank.class},
                new BankInvocationHandler(man));
        proxy.applyBank(); // 执行方法。
        System.out.println("=========================");
        proxy.lostBank();
    }

    private static class BankInvocationHandler implements InvocationHandler {
        private Man man; // 传入man, 最终还是要用man来执行其方法。
        public BankInvocationHandler(Man man) {
            this.man = man;
        }
        // proxy是代理对象，每个方法都能进入invoke。
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            if (man != null) {
                // 方法回调, 方法执行还是要 Man执行.
                // 可以在这里添加日志记录，
                System.out.println("方法执行：" + method.getName());
                Object object = method.invoke(man, method);
                System.out.println("方法执行之后.");
                return object;
            }
            return null;
        }
    }
}
